--[[
    Lua 是动态类型语言，变量不要类型定义，只需要为变量赋值。值可以存储在变量中，作为参数传递或结果返回。
    Lua 中有8个基本类型分别为： 
        nil             只有值nil属于该类，表示一个无效值（在条件表达式中相当于false）。
        boolean         包含两个值：false和true。
        umber           表示双精度类型的实浮点数
        string          字符串由一对双引号或单引号来表示
        userdata        由 C 或 Lua 编写的函数
        function        表示任意存储在变量中的C数据结构
        thread          表示执行的独立线路，用于执行协同程序
        table           Lua 中的表（table）其实是一个"关联数组"（associative arrays），数组的索引可以是数字或者是字符串。
                        在 Lua 里，table 的创建是通过"构造表达式"来完成，最简单构造表达式是{}，用来创建一个空表。
--]]
-- 测试变量或者值的类型
print(type("HelloWorld")) --> string
print(type(10)) --> number
print(type(10.3 * 2)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
print(type(b)) --> nil

--[[
    nil 类型表示一种没有任何有效值，它只有一个值 -- nil，
    例如打印一个没有赋值的变量，便会输出一个 nil 值
--]]
-- 对于全局变量和 table，nil 还有一个"删除"作用，给全局变量或者 table 表里的变量赋一个 nil 值，等同于把它们删掉
tab1 = {key1 = "val1", key2 = "val2", "val3"}
for k, v in pairs(tab1) do
    print(k .. "-" .. v)
end

tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. "-" .. v)
end

-- 关于 nil 比较
if (b == nil) then
    print("true")
end

if (type(b) == "nil") then
    print("true")
end

-- 布尔类型
-- boolean 类型只有两个可选值：true（真） 和 false（假），Lua 把 false 和 nil 看作是"假"，其他的都为"真":
if false or nil then
    print("At least  true")
else
    print("false 和 nil 都为 false!")
end

-- 字符串
-- 字符串由一对双引号或单引号来表示。
string1 = "this is string1"
string2 = 'this is string2'
print(string1)
print(string2)
-- 也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。
html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)
-- 在对一个数字字符串上进行算术操作时，Lua 会尝试将这个数字字符串转成一个数字
print("2" + 6)
print("2" + "6")
print("2 + 6")
print("-2e2" * "6")
-- 字符串的连接使用 ..
print("a" .. 'b')
print(157 .. 428)
-- 使用 # 来计算字符串的长度，放在字符串前面
len = "www.runoob.com"
print(#len)
print(#"www.runoob.com")


-- 表
-- 在 Lua 里，table 的创建是通过"构造表达式"来完成，最简单构造表达式是{}，用来创建一个空表。也可以在表里添加一些数据，直接初始化表
-- 创建一个空的 table
local tbl1 = {}
-- 直接初始表
-- 不同于其他语言的数组把 0 作为数组的初始索引，在 Lua 里表的默认初始索引一般以 1 开始
local tbl2 = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl2) do
    print("Key", key)
end


-- Lua 中的表（table）其实是一个"关联数组"（associative arrays），数组的索引可以是数字或者是字符串
a = {}
a["key"] = "value"
a[6] =  11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

